//
//  RSUserAccoutViewModel.swift
//  RSWeibo
//
//  Created by Macx on 16/8/11.
//  Copyright © 2016年 Macx. All rights reserved.
//

import UIKit

/*
1, MVVM模式, 在这里封装与 RSOauthViewController 和账户相关的 网络请求接口,可以使得 RSOauthViewController 中的代码比较简洁
2, 账户模型相关的东西则放在 RSUserAccountModel 里面, 这样不至于RSUserAccountModel里面的代码太过臃肿
 */

class RSUserAccoutViewModel: NSObject {
    
    /*
     在app中, 只有一个用户登录, 所以可以把这个RSUserAccoutViewModel做成单例
     */
    static let sharedUserAccountViewModel: RSUserAccoutViewModel = RSUserAccoutViewModel()
    
    /*
     1,userAccountViewModel 持有一个用户账户模型RSUserAccountModel属性对象userAccountModel, 在不同的网络接口请求中, 将请求到的数据逐步添加到userAccountModel中, 从而逐步完善userAccountModel中的数据
     2, 而且这个userAccountModel属性对象应该是从沙河中获取, 而不是创建的, 创建出来的userAccountModel里面的数据是空的, 从沙盒中获取的就有之前获取到的数据
     */
    var userAccountModel: RSUserAccountModel?{
    
        // 返回值是从沙盒中获取到的userAccountModel, 使用的是类方法
        return RSUserAccountModel.loadUserAccountModel()
        
    }
    
    

}


// 使用 code 请求 access_token 方法
extension RSUserAccoutViewModel{
    
    func requestAccess_TokenWithCode(code: String, isRequestSuccessClosuer: (isSuccess:Bool)->()){
        
        // 使用网路工具类
        RSNetTool.sharedTool.requestAccess_tokenWithCode(code) { (reseponse, error) in
            if error != nil{
                
                print("网络请求失败了\(error)")
                // 尝试实行判断网络请求是否成功的闭包
                isRequestSuccessClosuer(isSuccess: false)
                return
            }
            
            // 执行到这里, 说明error不为nil, 也就是网络请求是有数据的
            
            //判断服务器给的字典是不是正确的
            guard let dict = reseponse as? [String : AnyObject] else{
                
                print("服务器返回的字典样式不正确")
                return
            }
            
            // 代码走到这里, 说明返回的字典类型也没出错
            
            // 根据key 值取出 access_token, 并强转为 String 类型
            let access_token = dict["access_token"] as? String
            
            // 字典转模型
            var userAccountModel = RSUserAccountModel(dict: dict)
            
            // 请求用户数据
            self.getTokenInfo(userAccountModel, access_token: access_token!,isRequestSuccessClosuer:isRequestSuccessClosuer)
            
        }
    }
}

// 使用 access_token 请求 get token info 的方法
// 在方法中添加一个RSUserAccountModel 类型的参数userAccountModel, 可以在各个网络请求中往userAccountModel中添加请求到的数据
extension RSUserAccoutViewModel{
    
    
    func getTokenInfo(userAccountModel: RSUserAccountModel, access_token: String,isRequestSuccessClosuer: (isSuccess:Bool)->()) {
        // 使用网络工具类请求数据
        RSNetTool.sharedTool.getTokendInfoWithAccess_Token(access_token) { (reseponse, error) in
            
            if error != nil{
                
                print("get token info网络请求失败了\(error)")
                // 尝试实行判断网络请求是否成功的闭包
                isRequestSuccessClosuer(isSuccess: false)
                return
            }
            
            // 执行到这里, 说明error不为nil, 也就是网络请求是有数据的
            
            //判断服务器给的字典是不是正确的
            guard let dict = reseponse as? [String : AnyObject] else{
                
                print("get token info服务器返回的字典样式不正确")
                return
            }
            
            // 代码走到这里, 说明返回的字典类型也没粗
//            print(dict)
           
   
            // 请求用户信息的方法
            self.getUser_show(userAccountModel, access_token: access_token, isRequestSuccessClosuer: isRequestSuccessClosuer)
            
        }
    }
    
    
}

// 请求用户信息 users/show
extension RSUserAccoutViewModel{
    

    func getUser_show(userAccountModel: RSUserAccountModel, access_token: String,isRequestSuccessClosuer: (isSuccess:Bool)->()) {
        
    
        // 使用网络工具类请求数据
        RSNetTool.sharedTool.getUser_show(userAccountModel, access_token: access_token) { (reseponse, error) in
            
            if error != nil{
                
                print("get token info网络请求失败了\(error)")
                // 尝试实行判断网络请求是否成功的闭包
                isRequestSuccessClosuer(isSuccess: false)
                return
            }
            
            // 执行到这里, 说明error不为nil, 也就是网络请求是有数据的
            
            //判断服务器给的字典是不是正确的
            guard let dict = reseponse as? [String : AnyObject] else{
                
                print("get token info服务器返回的字典样式不正确")
                return
            }
            
            // 代码走到这里, 说明返回的字典类型也没粗
//            print(dict)
            // 将请求回来的数据中需要的部分添加到userAccountModel 里面
            userAccountModel.name = dict["name"] as? String
            userAccountModel.avatar_large = dict["avatar_large"] as? String
            
            // 执行到此时候, 将数据存储回沙盒中
            userAccountModel.saveUserAccoutModel()
            
            // 代码执行到这里, 说明用户已经登录成功了
            isRequestSuccessClosuer(isSuccess: true)

        }
    
    }

}



